#include<iostream>
//四种转化，前面两种重要
class Base
{
public:
    virtual void show()
    {
        std::cout<<"base"<<std::endl;
    }
};
class Derived:public Base
{
public:
    virtual void show()
    {
        std::cout<<"Derived"<<std::endl;
    }
};







int main()
{
    //静态转化
    //支持基础数据类型转换
    //不同类型的指针不允许进行转化
    //支持void *和其他类型的数据相互转化
    //可以用于父子类之间的转换，但是不会安全检查
    int a=10;
    int *p=&a;
    int*c=static_cast<int *>p;

    Base *b=new Base;
    Derived *d=static_cast<Derived*>(b);//父类转化成子类，向下转型
    d->show();//输出结果仍是父类的show
    //d转化成了子类对象，但是没有进行安全检查，出现错误仍可以进行转化

    //std::cout<<b<<std::endl;



    //动态转化
    //用于父子类之间的转化
    //会进行类型安全检查
    //当向下转型不安全时，会返回空指针
    //如果没有虚函数，向下转型直接编译失败
    Base *b=new Base;
    Derived *d=dynamic_cast<Derived*>(b);//向下转型
    if(d==nullptr)
    {
        std::cout<<"空指针！\n";
    }
    else
        d->show();//输出结果是子类的show()



    //常量转化
    // const int a=20;
    // int b=const_cast<int*>(&a);


    //相当于强制类型转化 最不安全
    int a=20;
    double *b=reinterpret_cast<double*>(a);



    return 0;
}